第一问显然是一个很简单的 $DP$ ,但是第二问和第三问就要用最大流来求了,怎么求呢?
首先我们 $DP$ 出来的 $f$ 数组,$f[i]$ 表示以i结尾的最长不下降子序列的长度 ,然后就是网络流的连边了。首先因为一个点只能经过两次,我们需要将其拆为入点和出点,中间连的边的边权自然是 $1$ ,然后对于一个 $i$ ,如果 $f[i]$ 等于最长长度($s$),那么很显然这个 $i$ 就可以给答案做出一个贡献,这个时候 $i$ 的出点向 $t$ 连一条边权为 $1$ 边。
如果 $i$ 等于 $1$ ,那么自然 $1$ 是可以作为一个起点的,那么 $s$ 向 $i$ 的入点连一条边权为 $1$ 的边即可。
然后就是剩下的情况了,可以想到让 $i$ 向 $i$ 能够最优转移的位置连边,也就是说,如果有一个 $j$ ,使得 $f[j]=f[i]+1$ 并且 $a[i]<=a[j]$ ,这个时候如果是在最优方案中 $i$ 是可以转移到 $j$ 的,这个时候从 $i$ 的出点向 $j$ 的入点连一条边,边权依旧是 $1$ 。
然后我们这个时候跑最大流,就是第二问的答案。
那么第三问呢?
很显然,对于 $1$ ,如果它是连向 $s$ 的,则将其连向 $s$ 的边的边权改为 $inf$ ,并将入点连出点的边权改为 $inf$ ,表示可以取无限次。然后 $n$ 如果连向了 $t$ ,也将边权改为 $inf$ ,并将入点连出点的边权改为 $inf$ ,和上面同理。这个时候再跑一次最大流即可,这就是第三问的答案了。
1 |
|
本文标题:【题解】 「网络流24题」最长不下降子序列问题 网络流 luoguP2766
文章作者:Qiuly
发布时间:2019年03月26日 - 00:00
最后更新:2019年03月29日 - 13:54
原始链接:http://qiulyblog.github.io/2019/03/26/[题解]luoguP2766/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。